//包装函数
module.exports = function (grunt) {
    //任务配置，所有插件的配置信息
    grunt.initConfig({
        //获取packege.json的信息
        pkg: grunt
            .file
            .readJSON('package.json'),
        // 清除目录
        clean: {
            image: 'src/upload'
            // css: 'src/css*'
        },
        // 文件合并
        concat: {
            options: {
                separator: ';', //分离器
                stripBanners: true
            },
            js: {
                src: ['src/scripts/**/*.js'],
                dest: 'dist/scripts/<%= pkg.name %>.js'
            }
        },
        //uglify插件的配置信息（js压缩）
        uglify: {
            //“options”中规定允许生成的压缩文件带banner，即在生成的压缩文件第一行加一句话说明。注意，其中使用到了pkg获取package.json的内容
            options: {
                stripBanners: true,
                banner: '/*! <%=pkg.name%>-<%=pkg.version%>.js <%= grunt.template.today("yyyy-mm-dd") %> ' +
                    '*/\n'
            },
            //“build”中配置了源文件和目标文件。即规定了要压缩谁？压缩之后会生成谁？注意，我们这里将目标文件的文件名通过pkg的name和version来命名。
            build: { //子任务
                files: [{
                    expand: true,
                    cwd: 'src/script',
                    src: '*.js',
                    dest: 'dist/scripts/<%=pkg.name%>-<%=pkg.version%>.min.js'
                }]
            }
        },
        //cssmin插件配置信息（css压缩）
        cssmin: {
            options: {
                sourceMap: true,
                // 生成sourceMap文件
            },
            target: { //子任务
                files: [{
                    // 展开下面*通配符匹配的文件
                    expand: true,
                    // 源文件根目录
                    cwd: 'src/styles/css',
                    // 不要做 “!” 指定的文件
                    src: ['*.css'],
                    // 压缩文件的输出目录
                    dest: 'dist/styles/css',
                    // 压缩文件的后缀名
                    ext: '.min.css'
                }]
            }
        },
        // 通过sass编译成css文件
        sass: {
            dist: {
                files: [
                    {
                        expand: true,
                        cwd: 'src/styles/sass',
                        src: ['/*.scss'],
                        dest: 'src/styles/css',
                        ext: '.css'
                    }
                ],
            }
        },
        //压缩图片
        imagemin: {
            prod: {
                options: {
                    optimizationLevel: 7,
                    pngquant: true
                },
                files: [{
                    expand: true, //设置为true，表示要支持cwd等更多配置
                    cwd: 'dist/images', //所有的源文件路径，都是相对于cwd
                    src: ['images/*.{png,jpg,jpeg,gif,webp,svg}'], // 表示sr/flashc目录下的所有以上后缀名文件，这里用了通配符
                    dest: 'dist/images' //目标路径。
                    //优化后的图片保存位置，覆盖旧图片，并且不作提示。
                }]
            }
        },
        //jshint插件配置信息（js语法错误检查）
        jshint: {
            options: {
                jshintrc: '.jshintrc'
            },
            files: ['Gruntgile.js', 'src/scripts/**/*.js']
        },
        //css插件配置信息（css语法错误检查）
        csslint: {
            options: {
                jshintrc: '.csslintrc'
            },
            build: ['Gruntgile.js', 'src/styles/**/*.css']
        },
        //html检查
        htmlhint: {
            build: {
                options: {
                    'tag-pair': true, //标签配对
                    'tagname-lowercase': true, //标签名 小写
                    'attr-lowercase': true, //属性名称小写
                    'attr-value-double-quotes': true, //属性值使用双引号
                    'doctype-first': true, //html标签在头部
                    'spec-char-escape': true, // 特殊字符必须转义
                    'id-unique': true, //ID 属性必须唯一
                    'head-script-disabled': true, //头部js文件检查
                    'style-disabled': true //文件内部样式禁止
                },
                src: ['index.html']
            }
        },
        copy: {
            html: {
                expand: true,
                cwd: 'src/',
                src: '{,*/**/,*/}*.html',
                dest: 'dist'
            },
            images: {
                expand: true,
                cwd: 'src/images/',
                src: '{*/*,*}.{gif,webp,svg}',
                dest: 'dist/images'
            },
            // css: {
            //     expand: true,
            //     cwd: 'src/styles/css/',
            //     src: '*.css',
            //     dest: 'dist/styles/css'
            // },
            icon: {
                expand: true,
                cwd: 'src/',
                src: '*.ico',
                dest: 'dist'
            }
        },
        // sass实时编译
        compass: { // Task
            dist: { // Target
                options: { // Target options
                    // config: 'config.rb',
                    sassDir: 'src/styles/sass/style.scss', //sass文件目录
                    cssDir: 'src/styles/css/style.css', //输出css的目录
                    // environment: 'production', //生产环境
                    // relativeAssets: true //使用相对路径输出
                }
            }
        },
        //实时刷新
        connect: {
            options: {
                port: 8000,
                hostname: '*', //默认就是这个值，可配置为本机某个 IP，localhost 或域名
                livereload: 35729 //声明给 watch 监听的端口
            },
            server: {
                options: {
                    open: true, //自动打开网页 http://
                    base: [
                        'dist' //主目录
                    ]
                }
            }
        },

        // watch将监控src文件夹下所有js文件和css文件的变化，一旦变化，则立即执行jshint和uglify两个插件功能。
        // 运行grunt命令，控制台提示watch已经开始监听。此时要想停止，按ctrl + c即可 检测改变，自动跑sass任务
        watch: {
            configFiles: {
                files: [
                    'Gruntfile.js', 'config.rb'
                ],
                options: {
                    reload: true,
                    tasks: ['default']
                }
            },
            scripts: {
                files: 'src/scripts/{,*/}*.js',
                tasks: ['jshint'],
                options: {
                    interrupt: true,
                    tasks: ['default']
                }
            },
            sass: {
                files: 'src/styles/{,*/}*.scss',
                tasks: ['sass'],
                options: {
                    livereload: true,
                    tasks: ['default']
                }
            },
            images: {
                files: 'src/images/{,*/}*.{png,jpg}'
            }
        }
    });

    // 文件清除
    grunt.loadNpmTasks('grunt-contrib-clean');
    // 文件合并
    grunt.loadNpmTasks('grunt-contrib-concat');
    // 告诉grunt我们将使用的插件 js压缩
    grunt.loadNpmTasks('grunt-contrib-uglify');
    //css压缩
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    //sass转换成css
    grunt.loadNpmTasks('grunt-contrib-sass');
    //图片压缩
    grunt.loadNpmTasks('grunt-contrib-imagemin');
    //检查js语法错误
    grunt.loadNpmTasks('grunt-contrib-jshint');
    //检查css语法错误
    grunt.loadNpmTasks('grunt-contrib-csslint');
    //检查html语法错误
    grunt.loadNpmTasks('grunt-htmlhint');
    //复制文件、文件夹
    grunt.loadNpmTasks('grunt-contrib-copy');
    //sass实时刷新
    grunt.loadNpmTasks('grunt-contrib-compass');
    //实时刷新
    grunt.loadNpmTasks('grunt-contrib-connect');
    //实现自动化
    grunt.loadNpmTasks('grunt-contrib-watch');
    //告诉grunt当我们在终端输入grunt时需要做些什么（注意先后顺序)
    grunt.registerTask('default', [
        'clean',
        'concat',
        'uglify',
        'cssmin',
        'sass',
        'imagemin',
        'jshint',
        'csslint',
        'htmlhint',
        'copy',
        'compass',
        'connect',
        'watch'
    ]);

}